﻿<p>
    互动手工消歧技术设计</p>
<h1>
    1、需求说明</h1>
<p>
    1)根据解析程序的多个结果进行选择</p>
<p>
    2）对于解析程序无法完全确定结果的进行人工的指导选择，得到最后的结果</p>
<p>
    交互式消岐是在已有的语义结点(Semantic Node)的基础上获取该语义树的所有语言结点( Language 
    Node)，所有的LangugeNode的集合时一个偏序集，形成一个格结构，称为语言格(Language Lattice)，然后在这个基础上再进行消岐。 
</p>
<p>
    &nbsp;</p>
<h1>
    2、系统架构设计</h1>
<p>
    下层歧义定位</p>
<p>
    针对第一种需求：</p>
是在已有的语义结点(Semantic Node)的基础上获取该语义树的所有语言结点( Language 
Node)，所有的LangugeNode的集合时一个偏序集，形成一个格结构，称为语言格(Language Lattice)，然后在这个基础上再进行消岐。 
进行第一种情形消歧的架构设计入下： 
<p>
    &nbsp;</p>
<ol>
    <li>①从语义结点中获取所有的语言结点 </li>
    <li>②从得到的语言结点形成一个语言格，从语言格至底向上的筛选出选择出具有歧异的语言结点。 </li>
    <li>&nbsp;③在分析过程中，遇到具有歧异进行交互操作，用户选择出对于这个歧异语言结点分析正确的结果。 </li>
    <li>&nbsp;④根据用户的选择，再进行进一步的歧异分析，直到选择出到根节点（也就是这个要分析的句子）的正确结果。 </li>
</ol>
<h1>
    3、关键技术、数据结构、算法说明</h1>
<p>
    3.1算法说明</p>
<p align="left" class="MsoNormal">
    <a name="OLE_LINK4"></a><a name="OLE_LINK3">
    <span style="mso-bookmark: OLE_LINK4"><b><span lang="EN-US" 
        style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 宋体">
    <span style="mso-list: Ignore">1)<span style="FONT: 7pt 'Times New Roman'">&nbsp;
    </span></span></span>
    <span style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">
    从语义结点中获取所有的语言结点<O:P></O:P></span></b></span></a></p>
<p align="left" class="MsoNormal">
    <span style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">
    首先需要说明一个数据结构，这个数据结构应该包含该语言结点本身以及该语言结点的父节点。数据结构中父节点就是在选择该结点时可能出现的歧义。<span 
        lang="EN-US"><O:P></O:P></span></span></p>
<p align="left" class="MsoNormal">
    <span style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">
    每个<span lang="EN-US">Language Node</span>都有唯一的<span lang="EN-US">Position Key,</span>根据<span 
        lang="EN-US">Position Key</span>的唯一性，利用<span lang="EN-US">Hash</span>方法，从<span 
        lang="EN-US">Semantic Node</span>中获取所有<span lang="EN-US">Language Node</span>，并将该语言结点的父亲语言结点保存下来。同时，将在<span 
        lang="EN-US">Semantic Node</span>中最底端的叶子结点标记出来，方便下面的消岐工作。<span lang="EN-US"><O:P></O:P></span></span></p>
<p align="left" class="MsoNormal">
    <span style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">
    说明：<span lang="EN-US">Semantic Node</span>的叶子结点在语义方面已经是最底端的结点了，所以叶子结点肯定是没有歧义的，记录下来，减少后面消岐步骤的判断。<span 
        lang="EN-US"><O:P></O:P></span></span></p>
<p align="left" class="MsoNormal">
    <O:P></O:P>
</p>
<p>
    <b>
    <span style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">
    2）从得到的语言结点进行交互式消岐</span></b></p>
<p align="left" class="MsoNormal">
    <span style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">
    算法<span lang="EN-US">f(</span>一个语言结点<span lang="EN-US">)</span>：<span 
        lang="EN-US"><O:P></O:P></span></span></p>
<p align="left" class="MsoNormal">
    <span style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">
    构造一个正确的语言结点序列<span lang="EN-US">CorrectNodeList</span>，这个集合中包括已经消岐或者不用消岐的语言结点，并且有一个标志该结点是否有被结合过。<span 
        lang="EN-US"><O:P></O:P></span></span></p>
<p align="left" class="MsoNormal">
    <span lang="EN-US" 
        style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">
    A.</span><span 
        style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">初始话<span 
        lang="EN-US">CorrectNodeLIst,</span>将上一步得到所有的叶子结点都加入。<span lang="EN-US"><O:P></O:P></span></span></p>
<p align="left" class="MsoNormal">
    <span lang="EN-US" 
        style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">
    B.</span><span 
        style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">若该语言结点的父亲结点只有一个，分成两种情况：<span 
        lang="EN-US"><O:P></O:P></span></span></p>
<p align="left" class="MsoNormal">
    <span lang="EN-US" 
        style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">
    <span style="mso-spacerun: yes">&nbsp;</span></span><span 
        style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">①这个唯一的父节点<span 
        lang="EN-US">Parent</span>是根节点，即为需要<span lang="EN-US">Parse</span>的语句，则显示结果。<span 
        lang="EN-US"><O:P></O:P></span></span></p>
<p class="MsoNormal">
    <span lang="EN-US" 
        style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">
    <span style="mso-spacerun: yes">&nbsp;</span></span><span 
        style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">②这个唯一的父节点不是根节点，则将该节点以及该父节点以及父节点所包含的其他子节点加入<span 
        lang="EN-US">CorrectNodeList</span>集合中。<span lang="EN-US">F(Parent)</span>。<span 
        lang="EN-US"><O:P></O:P></span></span></p>
<p class="MsoNormal">
    <span lang="EN-US" 
        style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">
    B.</span><span 
        style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">该节点的父亲结点不是只有一个，针对该节点的每一个父亲结点，判断该父亲结</span><span 
        style="FONT-FAMILY: 宋体; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">点的孩子结点是不是都在<span 
        lang="EN-US">CorrectNodeList</span>，进行计数。并将都子节点都在<span lang="EN-US">CorrectNodeList</span>中的父节点标记为需要交互的分支。<span 
        lang="EN-US"><O:P></O:P></span></span></p>
<p class="MsoNormal">
    <span style="FONT-FAMILY: 宋体; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">
    该计数值<span lang="EN-US">&gt;1,</span>则说明需要进行交互；否则尝试</span><span lang="EN-US" 
        style="FONT-FAMILY: 新宋体; FONT-SIZE: 11pt; mso-bidi-font-size: 10.0pt">CorrectNodeList</span><span 
        style="FONT-FAMILY: 新宋体; FONT-SIZE: 11pt; mso-bidi-font-size: 10.0pt">域中没有结合过的结点。进行算法<span 
        lang="EN-US">F.<O:P></O:P></span></span></p>
<p>
    &nbsp;</p>
<p>
    3<b><span lang="EN-US" 
        style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 宋体"><span 
        style="mso-list: Ignore">)<span style="FONT: 7pt 'Times New Roman'">&nbsp;
    </span></span></span>
    <span style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">
    进行交互操作</span></b></p>
<p align="left" class="MsoNormal">
    <span lang="EN-US" 
        style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 宋体">
    <span style="mso-list: Ignore">A.</span></span><span 
        style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">根据前面的算法显示出需要进行交互的结点，并显示出歧义的分支，也就是从<span 
        lang="EN-US"><O:P></O:P></span></span></p>
<p align="left" class="MsoNormal">
    <span lang="EN-US" 
        style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">
    <span style="mso-spacerun: yes">&nbsp;&nbsp; </span>2</span><span 
        style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">）<span 
        lang="EN-US">-B</span>中得到的需要交互的分支。<span lang="EN-US"><O:P></O:P></span></span></p>
<p class="MsoNormal">
    <span lang="EN-US" 
        style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">
    B.</span><span 
        style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">用</span><span 
        style="FONT-FAMILY: 宋体; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">户选择出正确的<span 
        lang="EN-US">Parse</span>方式后，获取被选择的正确的分支（结点的一个父亲语言结点）。如果选出来的分支就是该语句的根节点，则直接显示结果，结束；否则，</span><span 
        style="FONT-FAMILY: 新宋体; FONT-SIZE: 11pt; mso-bidi-font-size: 10.0pt">标记选出来的分支结点的子结点已经被结合，并标记选出来的分支结点加入<span 
        lang="EN-US">CorrectNodeList</span>，算法<span lang="EN-US">F</span>（选出来的分支结点）。</span><span 
        lang="EN-US" 
        style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt"><O:P></O:P></span></p>
<p align="left" class="MsoNormal">
    <span style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 11.5pt; mso-bidi-font-size: 10.0pt">
    通过<span lang="EN-US">1</span>）<span lang="EN-US">2</span>）<span lang="EN-US">3</span>）步骤，就可以经过多次的用户交互选择，得到正确的分析。<span 
        lang="EN-US"><O:P></O:P></span></span></p>
<p>
    3.2数据结构说明</p>
<p>
    3.2.1</p>
<p>
    public class CorrectNode
</p>
<p>
    {
</p>
<p>
&nbsp;&nbsp;&nbsp; public string value;
</p>
<p>
&nbsp;&nbsp; public bool IsScanned;
</p>
<p>
    }</p>
<p align="left" class="MsoNormal">
    CorrectNode数据结构用来描述正确的节点的值以及这个节点是否被扫描过。</p>
<p align="left" class="MsoNormal">
    public class LangNode : Node
</p>
<p align="left" class="MsoNormal">
    {
</p>
<p align="left" class="MsoNormal">
&nbsp;&nbsp;&nbsp;&nbsp; public int AbsolutePos;
</p>
<p align="left" class="MsoNormal">
&nbsp;&nbsp;&nbsp;&nbsp; public List<LANGNODE> Children;
</p>
<p align="left" class="MsoNormal">
&nbsp;&nbsp;&nbsp;&nbsp; public bool IsValid;</p>
<p align="left" class="MsoNormal">
&nbsp;&nbsp;&nbsp;&nbsp; public LangNode Next;&nbsp;&nbsp;&nbsp;
</p>
<p align="left" class="MsoNormal">
&nbsp;&nbsp;&nbsp;&nbsp; public List<LANGNODE> Parents;</p>
<p align="left" class="MsoNormal">
&nbsp;&nbsp;&nbsp;&nbsp; public SemanticPosition Position;
</p>
<p align="left" class="MsoNormal">
&nbsp;&nbsp;&nbsp;&nbsp; public LangNode Previous;</p>
<p align="left" class="MsoNormal">
&nbsp;&nbsp;&nbsp;&nbsp; public List<SEMANTICNODE> SemanticNodes;</p>
<p align="left" class="MsoNormal">
&nbsp;&nbsp;&nbsp;&nbsp; public int SN;</p>
<p align="left" class="MsoNormal">
&nbsp;&nbsp;&nbsp;&nbsp; public SliceType Type;</p>
<p align="left" class="MsoNormal">
&nbsp;&nbsp;&nbsp;&nbsp; public List<WORDSPATTERNCHARTNODE> 
    WordsPatternChartNodes;</p>
<p align="left" class="MsoNormal">
    ...</p>
<p align="left" class="MsoNormal">
&nbsp;&nbsp;&nbsp; }</p>
<p align="left" class="MsoNormal">
    LangNode数据结构描述语义节点，LangNode内的Parents使得这些语义节点形成语义网格。方便遍历。</p>
<h1>
    4、问题讨论</h1>
<p>
    1.有些语句不能通过手动交互完成翻译</p>
<p>
    &nbsp;比如，带逗号的语句&nbsp;</p>
